from apps.contents.utils import get_category
from apps.goods.models import SKUSpecification, SKU, GoodsCategory
from django.template import loader

# 封装生成详情页方法
def create_detail_html(id):
    """

           :param request:
           :param id: sku商品id
           :return:
           """
    # 1、根据商品id查询sku表获取商品对象
    try:
        sku = SKU.objects.get(id=id)
    except:
        print('error')
    # 2、获取商品分类数据，调用封装的方法
    categories = get_category()

    # 3、获取面包屑导航数据
    # 获取当前商品的分类数据，构造面包屑导航数据。查询商品分类表
    cat3 = GoodsCategory.objects.get(
        id=sku.category.id)  # 传递分类id,通过sku.category.id 获取到sku对应的商品分类的对象，进而获取商品分类id。sku副表，商品分类是主表
    # 根据三级分类数据获取二级分类
    cat2 = cat3.parent
    # 根据二级分类数据获取一级分类
    cat1 = cat2.parent

    # 对商品的的选项进行选中展示
    # 知道当前商品的选项是什么,获取当前商品的规格，然后根据规格回去对应的选项
    # sku_specs = sku.specs  # 根据主表sku查询副表SKUSpecification，related_name='specs',
    sku_specs = SKUSpecification.objects.filter(sku=sku).order_by('spec_id')
    sku_key = []
    for spec in sku_specs:
        sku_key.append(spec.option_id)
    print(sku_key)

    # 获取所有商品的规格选项，和当前商品进行比对
    # 需要先获取所有sku商品，所有商品和spu有关联关系
    spu = sku.spu  # 副表查询主表
    skus = SKU.objects.filter(spu=spu)  # 获取spu商品系列下的所有内容
    # 字典赋值
    sku_spec_option = {}
    for sku_data in skus:
        s_key = []
        sku_specs = SKUSpecification.objects.filter(sku=sku_data).order_by('spec_id')
        for spec in sku_specs:
            s_key.append(spec.option_id)
        # 将每个sku商品的选项和本身id值进行绑定
        sku_spec_option[tuple(s_key)] = sku_data.id
    # {(11,12):sku_id1,(11,14):sku_id2}
    print(sku_spec_option)

    # 4、渲染规格数据
    # 获取当前商品的所有规格，需要的到当前商品的spu

    goods_specs = spu.specs.all()  # 主表查询副表 在 SPUSpecification表中，关联的spu外键中指定了related_name='specs'参数，那么在进行查询时可以使用该字段来表示副表内容，不在使用副表小写_set形式

    # 遍历规格指定规格选项
    for index, spec in enumerate(goods_specs):
        # 原有规格赋值
        key = sku_key[:]  # 所有下表的数据赋值
        # 根据规格查询该规格下的所有选项  主表查询副表
        spec_options = spec.options.all()
        # 给当前选项赋值sku商品id
        for option in spec_options:
            key[index] = option.id
            option.sku_id = sku_spec_option.get(tuple(key))
        # 在spec中增加一个属性spec_options，spec是遍历的商品规格对象
        spec.spec_options = spec_options
    # 构造渲染数据
    context = {
        'sku': sku,
        'categories': categories,
        'breadcrumb': {  # 面包屑数据
            'cat1': cat1.name,
            'cat2': cat2.name,
            'cat3': cat3.name
        },
        'specs': goods_specs

    }
    # return render(request, 'detail.html', context=context)

    # response = render(request, 'detail.html', context=context)
    template = loader.get_template('detail.html')
    html_str = template.render(context)
    with open('/Users/august/Desktop/front_end_pc/goods/%d.html' % sku.id, 'w') as f:
        f.write(html_str)
